package l1j.server.server.clientpackets;

import java.sql.Timestamp;
import java.util.logging.Level;
import java.util.logging.Logger;

import l1j.opqlo.NewSystem.各項記錄輸出;
import l1j.opqlo.Server.L1World.L1World;
import l1j.opqlo.Server.L1World.WorldClan;
import l1j.server.Config;
import l1j.server.echo.ClientThread;
import l1j.server.server.datatables.BuddyTable;
import l1j.server.server.datatables.CharObjidTable;
import l1j.server.server.datatables.CharacterTable;
import l1j.server.server.model.L1Clan;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.serverpackets.S_DeleteCharOK;

// Referenced classes of package l1j.server.server.clientpackets:
// ClientBasePacket, C_DeleteChar

/**
 * 處理收到由客戶端傳來刪除角色的封包
 */
public class C_DeleteChar extends ClientBasePacket {

	private static final String C_DELETE_CHAR = "[C] RequestDeleteChar";

	private static Logger _log = Logger.getLogger(C_DeleteChar.class.getName());

	@Override
	public String getType() {
		return C_DELETE_CHAR;
	}

	@Override
	public void start(final byte[] decrypt, final ClientThread client) {
		try {
			// 資料載入
			this.read(decrypt);
		final String name = this.readS();
		if(name == null){
			return;
		}
		if (name.isEmpty()) {
			return;
		}

		try {
			final L1PcInstance pc = CharacterTable.getInstance().restoreCharacter(name);
			if (pc != null && pc.getLevel() >= 30
					&& Config.DELETE_CHARACTER_AFTER_7DAYS) {
				if (pc.getType() < 32) {
					if (pc.isCrown()) {
						pc.setType(32);
					} else if (pc.isKnight()) {
						pc.setType(33);
					} else if (pc.isElf()) {
						pc.setType(34);
					} else if (pc.isWizard()) {
						pc.setType(35);
					} else if (pc.isDarkelf()) {
						pc.setType(36);
					} else if (pc.isDragonKnight()) {
						pc.setType(37);
					} else if (pc.isIllusionist()) {
						pc.setType(38);
					}
					final Timestamp deleteTime = new Timestamp(System.currentTimeMillis() + 604800000); // 7日後
					pc.setDeleteTime(deleteTime);
					pc.save(); // DBにキャラクター情報を書き込む
				} else {
					if (pc.isCrown()) {
						pc.setType(0);
					} else if (pc.isKnight()) {
						pc.setType(1);
					} else if (pc.isElf()) {
						pc.setType(2);
					} else if (pc.isWizard()) {
						pc.setType(3);
					} else if (pc.isDarkelf()) {
						pc.setType(4);
					} else if (pc.isDragonKnight()) {
						pc.setType(5);
					} else if (pc.isIllusionist()) {
						pc.setType(6);
					}
					pc.setDeleteTime(null);
					pc.save(); // DBにキャラクター情報を書き込む
				}
				client.out().encrypt(new S_DeleteCharOK(S_DeleteCharOK.DELETE_CHAR_AFTER_7DAYS));
				return;
			}

			if (pc != null) {

				L1World.getInstance().removeTradeInventory(pc.getId());

				final StringBuilder aa=new StringBuilder().append("IP(").append(client.getIp().toString()).append(")玩家:【").append(client.getAccountName()).append("】	刪除角色 [ ").append(name).append(" ](").append(pc.getId()).append(") 時間:(").append(new Timestamp(System.currentTimeMillis())).append(")。");
				各項記錄輸出.LogSave(15, aa.toString());
				aa.delete(0, aa.length());

				for(final L1PcInstance buddys : L1World.getInstance().getAllPlayers()){
					//BuddyTable.getInstance().removeBuddy(buddys.getId(), pc_name);
					if(pc != buddys){
					BuddyTable.getInstance().getBuddyTable(buddys.getId()).remove(pc.getName());
					}
				}
				final L1Clan clan = WorldClan.get().getClan(pc.getClanname());
				if (clan != null) {
					clan.delMemberName(name);
				}
			}
			// 已創人物數量
			final int countCharacters = client.getAccount().get_countCharacters();
			client.getAccount().set_countCharacters(countCharacters - 1);

			// 刪除人物
			CharacterTable.getInstance().deleteCharacter(client.getAccountName(), name);

			// 移出已用名稱清單
			CharObjidTable.get().charRemove(name);

		} catch (final Exception e) {
			_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
			client.close();
			return;
		}
		client.out().encrypt(new S_DeleteCharOK(S_DeleteCharOK.DELETE_CHAR_NOW));

		} catch (final Exception e) {
			_log.log(Level.SEVERE, e.getLocalizedMessage(), e);

		} finally {
			this.over();
		}
		}

}
